Skip to main content

4. 指令族语义

下表给出每个 unit 的共同语义;同一族的精确 opcode、操作数和例外由 YAML 中每条指令的 semantics 字段定义。

unit语义范围
valu32-bit 整数加减、移位、比较、逻辑、乘法/高半乘法、MAC、饱和、位域、置换、点积;f*.f32 的 IEEE binary32 运算、符号注入、分类、转换、舍入和 packed f16/i16 运算。.vu/.vi/.m/.vl 变体分别使用 uniform、立即数、第三源或 literal;目的受 EXEC。
salu与整数 VALU 对应的 warp-uniform 运算、立即数和相对寄存器寻址;exec.*、saveexec.*、exec.wqm 修改/读取 EXEC,忽略 lane 掩码。
fp64binary64 基本运算、FMA、比较、分类、转换、指数/尾数分解;64-bit 结果使用偶数对齐 vpair,延迟 fixed:16。
sfurcp/rsq/sqrt/exp2/log2/sin/cos 及整数/浮点除法余数。采用迭代实现,按 async:sfu 计数;approx 指令的误差界在实现手册声明。
xlaneshfl(index/up/down/xor/rotate/broadcast)、quad swizzle、写 lane、导数、scan、ballot/vote、readfirst/readlane 和整数归约;读取其他 lane 时要求 cross_lane,结果归约到 uniform 时标 uniform_result。
branchjmp、jal、jr/jalr 和 uniform 条件 bz/bnz/bany/bnone,以及按 EXEC 的 bexecz/bexecnz。控制转移是基本块边界,链接地址为当前指令地址加 4。
syncsleep、warp/workgroup barrier、icache.inv 和 waitcnt。屏障要求参与 warp 到达同一动态实例;不满足会暂停而非静默继续。
lsuglobal/ubase/buffer/shared/scratch 的标量宽度加载和存储;描述符寻址、cache policy、边界检查、向量与 uniform 载入;32/64-bit 原子、比较交换、自增减、浮点原子及 .rtn 返回旧值。
textex.sample(隐式/显式 LOD、偏移、比较)、gather/fetch/query 和 img.load/store/atom。坐标/维度/分量掩码由 dim、dmask、a16、d16 指定,描述符在 u 中。
gfxfragment interlock、透视/线性/平面插值、重心坐标、coverage/sample mask、helper/live、demote/discard、tile load/store 和 depth/stencil test。插值与 quad 读操作需 needs_wqm,仅片段有效的操作标 frag_only。
miscnop、endpgm、trap、brk、setprio 和 CSR 读写/置位/清位。endpgm 终止 warp;trap 进入 CP 陷阱路径。

flags​

YAML 中出现的每个 flag 都有以下精确定义,编译器不得删除其可观察效果:

flag约束
exec_ignored独立于 EXEC 执行(uniform、控制或显式 lane 操作)。
reads_exec将 EXEC 作为数据输入。
writes_exec修改 EXEC。
ends_block可能转移控制或结束 warp,终止基本块。
branch立即数为从当前指令地址起算的 PC 相对字节偏移。
indirect使用 u 中的 32-bit code offset 间接跳转。
call将返回地址 PC+4 写入链接寄存器。
cond条件控制转移。
terminates结束整个 warp。
may_trap可能产生陷阱。
serializing等待之前固定延迟工作完成,后续指令可见其效果。
sync屏障、互锁或 waitcnt 同步。
load / store / atomic分别读、写、读改写内存。
cache_opcache 维护操作。
bounds_checked描述符越界/null:load 返回 0,store/atomic 丢弃。
desc_based使用 u 中描述符;全零描述符为 null。
sparse_statusrsd=1 时额外返回 residency code,0 表示 resident。
fp_mode结果依赖 MODE。
rm_override有显式 rm,dyn 表示使用 MODE。
approx近似结果,误差要求写在具体语义中。
optional配置可不实现,驱动必须报告能力。
needs_wqm读取 2x2 quad 邻居,必须启用 whole-quad mode。
frag_only只允许 fragment/tile shader。
pair64使用偶数对齐的 64-bit 寄存器对。
half16操作 16-bit half。
uniform_result将 per-lane 数据归约到 uniform。
cross_lane读取其他 lane。
indexed_reg运行时计算寄存器号。